/*!
* 文件名     main.c
* 作者       聚沃科技
* 版本       V1.0
* 实验简介   EXMC-外部SRAM读写实验
*/

/*
* 版权说明
* 本程序只供学习使用，未经作者许可，不得用于其它任何用途
* GD32F303东方红开发板V1
* 在线购买：   http://juwo.taobao.com
* 技术交流：   http://www.gd32bbs.com/ask/
* 视频学习：   https://space.bilibili.com/475462605
* 微信公众号： gd32bbs
* 创建日期:    2023/8/30
* Copyright    苏州聚沃电子科技有限公司
* 版权所有，盗版必究。
*/

#include "app_eeprom.h"

#include <stdio.h>
#include "bsp_eeprom.h"
#include "bsp_lcd.h"

#include "driver_public.h"

#include "FreeRTOS.h"
#include "task.h"

//读写校验长度
#define BUFFER_SIZE                    1024


/*!
    \brief      init task
    \param[in]  pvParameters not used
    \param[out] none
    \retval     none
*/
Drv_Err eeprom_test(void)
{   
    uint8_t *tx_buffer,*rx_buffer;    
            
    bsp_eeprom_init_AT24C16();


    tx_buffer=pvPortMalloc(BUFFER_SIZE);
    rx_buffer=pvPortMalloc(BUFFER_SIZE);
    
    if(tx_buffer!=NULL && rx_buffer!=NULL)
    {
        memset(tx_buffer,0,BUFFER_SIZE);
        memset(rx_buffer,0,BUFFER_SIZE);
        //准备数据
        for(uint16_t i = 0; i < BUFFER_SIZE; i ++){
            tx_buffer[i] = 0x00ff&i;
        }
    }else{
        vPortFree(tx_buffer); 
        vPortFree(rx_buffer);             
        return DRV_ERROR;
    }
        
//    //写入数据 
    eeprom_buffer_write_AT24C16(tx_buffer,0x0000,BUFFER_SIZE);

    //读出数据
//    taskENTER_CRITICAL();
    delay_us(200);
    eeprom_buffer_read_AT24C16(rx_buffer,0x0000,BUFFER_SIZE);
//    taskEXIT_CRITICAL();
    //比较回读和写入数据
    if(DRV_ERROR == memory_compare(tx_buffer,rx_buffer,BUFFER_SIZE)){
        vPortFree(tx_buffer); 
        vPortFree(rx_buffer);            
        return DRV_ERROR;
    }else{
        vPortFree(tx_buffer); 
        vPortFree(rx_buffer);
        return DRV_SUCCESS;            
    }   
}

///*!
//    \brief      init task
//    \param[in]  pvParameters not used
//    \param[out] none
//    \retval     none
//*/
//Drv_Err eeprom_test(void)
//{   
//    uint8_t *tx_buffer,*rx_buffer;    
//        
//    printf_log("\n\rI2C EEPROM test:\n\r");
//    
//    bsp_eeprom_init_AT24C16();


//    tx_buffer=pvPortMalloc(BUFFER_SIZE);
//    rx_buffer=pvPortMalloc(BUFFER_SIZE);
//    
//    if(tx_buffer!=NULL && rx_buffer!=NULL)
//    {
//        memset(tx_buffer,0,BUFFER_SIZE);
//        memset(rx_buffer,0,BUFFER_SIZE);
//        //准备数据
//        for(uint16_t i = 0; i < BUFFER_SIZE; i ++){
//            tx_buffer[i] = 0x00ff&i;
//        }
//    }else{
//        printf_log("malloc fail!\n\r");
//        vPortFree(tx_buffer); 
//        vPortFree(rx_buffer);             
//        return DRV_ERROR;
//    }
//        
////    //写入数据 
//    eeprom_buffer_write_AT24C16(tx_buffer,0x0000,BUFFER_SIZE);

//    //读出数据
////    taskENTER_CRITICAL();
//    delay_us(200);
//    eeprom_buffer_read_AT24C16(rx_buffer,0x0000,BUFFER_SIZE);
////    taskEXIT_CRITICAL();
//    //比较回读和写入数据
//    if(DRV_ERROR == memory_compare(tx_buffer,rx_buffer,BUFFER_SIZE)){
//        printf_log("Err:Data Read and Write aren't Matching!\n\r");
//        vPortFree(tx_buffer); 
//        vPortFree(rx_buffer);            
//        return DRV_ERROR;
//    }else{
//        printf_log("EEPROM test Passed!\n\r");
//        vPortFree(tx_buffer); 
//        vPortFree(rx_buffer);
//        return DRV_SUCCESS;            
//    }
//    
//}

/*!
* 说明     main函数
* 输入     无
* 输出     无
* 返回值   无
*/
void eeprom_task(void * pvParameters)
{    
    //重新设置新的打印窗口
    bsp_lcd_printf_init(0,370,bsp_lcd_parameter.width-1,bsp_lcd_parameter.height-1,FONT_ASCII_12_6,BLUE,~BLUE);

    while (1)
    {    
        eeprom_test();
        vTaskDelay(1000);                                                  
    }
}

